﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Data;

namespace prjCompras
{
    public partial class frmProcGerarPlanoCompra : FormProcessoPadrao.FormProcessoPadrao
    {
        public frmProcGerarPlanoCompra()
        {
            InitializeComponent();
        }

        private struct mat
        {
            public string codigo;
            public string nome;
            public string qtde;
        }

        List<mat> materiais = new List<mat>();

        string camposReq = @"r.Codigo, r.Data, r.Observacao, 
                             case when r.Urgente = 0 then 'Não' else 'Sim' end as Urgente";
        string camposMatReq = @"m.Codigo, m.Nome as Material, rm.Quantidade";

        private void frmProcGerarPlanoCompra_Load(object sender, EventArgs e)
        {
            pnlFimProcesso.Visible = false;
            tbcntrlEtapas.Visible = false;
            pnlFimProcesso.Dock = DockStyle.Fill;
            pnlInicio.Dock = DockStyle.Fill;
            insereTextoProcesso(" Gerar Plano de Compras");
            DataGridViewCheckBoxColumn check = new DataGridViewCheckBoxColumn();
            check.TrueValue = true;
            check.FalseValue = false;
            check.HeaderText = "";
            
            dtmpckrDataPlano.Value = System.DateTime.Now;
            dtmpckrDataPlano.MinDate = System.DateTime.Now;

            string sql = "Select " + camposReq + " from " + ConstTabelas.REQUISIÇÃO + @" as r where Tipo = 0 and Situacao = 1 
                          and PlanoGerado = 0 order by Urgente Desc";

            dtgrdvwRequisicao.DataSource = Conexao.getInstance.executeQuery(sql);
            dtgrdvwRequisicao.Columns[0].HeaderText = "Código";
            dtgrdvwRequisicao.Columns[2].HeaderText = "Observação";
            dtgrdvwRequisicao.Columns.Add(check);
            foreach (DataGridViewRow r in dtgrdvwRequisicao.Rows)
            {
                r.Cells[4].Value = false;
            }
            
            for (int i = 0; i < dtgrdvwRequisicao.Columns.Count; i++)
            {
                dtgrdvwRequisicao.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
            }
        }

        private void dtgrdvwRequisicao_SelectionChanged(object sender, EventArgs e)
        {
            string codReq = "";
            if (dtgrdvwRequisicao.RowCount > 0)
            {
                codReq = dtgrdvwRequisicao.CurrentRow.Cells[0].Value.ToString();
            }
            string sql = @"Select " + camposMatReq + " from " + ConstTabelas.REQUISIÇÃO + " as r," + ConstTabelas.REQUISICAOMATERIAL +
                         @" as rm, " + ConstTabelas.MATERIAL + @" as m
                         where r.Codigo = rm.CodigoRequisicao 
                           and r.Codigo = '" + codReq + @"'
                           and m.Codigo = rm.CodigoMaterial";
            dtgrdvwMateriais.DataSource = Conexao.getInstance.executeQuery(sql);
            dtgrdvwMateriais.Columns[0].HeaderText = "Código";
        }

        private void dtgrdvwRequisicao_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if ((bool)dtgrdvwRequisicao.CurrentRow.Cells[4].Value)
            {
                dtgrdvwRequisicao.CurrentRow.Cells[4].Value = false;
                removeItem();
            }
            else
            {
                dtgrdvwRequisicao.CurrentRow.Cells[4].Value = true;
                addMaterial();
            }
            carregaGridMateriais();
        }

        private void addMaterial()
        {
            foreach (DataGridViewRow r in dtgrdvwMateriais.Rows)
            {
                if (materiais.Count == 0)
                {
                    mat m = new mat();
                    m.codigo = r.Cells[0].Value.ToString();
                    m.nome = r.Cells[1].Value.ToString();
                    m.qtde = r.Cells[2].Value.ToString();
                    materiais.Add(m);
                }
                else
                {
                    int i = 0;
                    mat m1 = new mat();
                    foreach (mat m in materiais)
                    {
                        if (m.codigo == r.Cells[0].Value.ToString())
                        {
                            m1.codigo = r.Cells[0].Value.ToString();
                            m1.nome = r.Cells[1].Value.ToString();
                            int qtde = Convert.ToInt32(r.Cells[2].Value) + Convert.ToInt32(m.qtde);
                            m1.qtde = qtde.ToString();
                            break;
                        }
                        i++;
                    }
                    if (i >= materiais.Count)
                    {
                        m1.codigo = r.Cells[0].Value.ToString();
                        m1.nome = r.Cells[1].Value.ToString();
                        m1.qtde = r.Cells[2].Value.ToString();
                        materiais.Add(m1);
                    }
                    else
                    {
                        materiais[i] = m1;
                    }
                }
            }
        }

        private void removeItem()
        {
            foreach (DataGridViewRow r in dtgrdvwMateriais.Rows)
            {
                int i = 0;
                mat m1 = new mat();
                foreach (mat m in materiais)
                {
                    if (m.codigo == r.Cells[0].Value.ToString())
                    {
                        m1.codigo = r.Cells[0].Value.ToString();
                        m1.nome = r.Cells[1].Value.ToString();
                        int qtde = Convert.ToInt32(m.qtde) - Convert.ToInt32(r.Cells[2].Value);
                        m1.qtde = qtde.ToString();
                        break;
                    }
                    i++;
                }
                if (i < materiais.Count)
                {
                    materiais[i] = m1;
                }
            }

            List<int> mat = new List<int>();
            int k = 0;
            foreach (mat m in materiais)
            {
                if (Convert.ToInt32(m.qtde) <= 0)
                {
                    mat.Add(k);
                }
                k++;
            }
            mat.Reverse();
            foreach (int j in mat)
            {
                materiais.RemoveAt(j);
            }
        }

        private void carregaGridMateriais()
        {
            dtgrdvwMateriaisPlano.Rows.Clear();
            foreach (mat m in materiais)
            {
                dtgrdvwMateriaisPlano.Rows.Add(m.codigo, m.nome, m.qtde);
            }
        }

        public override bool metodo()
        {
            if (materiais.Count == 0)
            {
                MessageBox.Show("Não há materiais adicionados no plano!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }
            List<String> campos = new List<string>();
            campos.Add("Data");
            campos.Add("Observacao");
            campos.Add("Urgente");
            campos.Add("Situacao");
            campos.Add("Tipo");
            campos.Add("PlanoGerado");
            campos.Add("CartaGerada");

            List<object> valores = new List<object>();
            valores.Add(dtmpckrDataPlano.Value.ToString());
            valores.Add(txbxObservacao.Text);
            valores.Add((chckbxUrgente.Checked ? 1 : 0));
            valores.Add(0);
            valores.Add(1);
            valores.Add(1);
            valores.Add(0);

            string sql = SqlCrud.getInstance.insert(ConstTabelas.REQUISIÇÃO, campos, valores);
            if (!Conexao.getInstance.execute(sql, false))
            {
                return false;
            }
            DataTable dt = Conexao.getInstance.executeQuery(SqlCrud.getInstance.selectMax(ConstTabelas.REQUISIÇÃO));
            string cod_req = dt.Rows[0][0].ToString();
            foreach (mat m in materiais)
            {
                campos.Clear();
                campos.Add("CodigoRequisicao");
                campos.Add("CodigoMaterial");
                campos.Add("Quantidade");

                valores.Clear();
                valores.Add(cod_req);
                valores.Add(m.codigo);
                valores.Add(m.qtde);

                sql = SqlCrud.getInstance.insert(ConstTabelas.REQUISICAOMATERIAL, campos, valores);

                if (!Conexao.getInstance.execute(sql, false))
                {
                    return false;
                }
            }
            foreach (DataGridViewRow r in dtgrdvwRequisicao.Rows)
            {
                if (Convert.ToBoolean(r.Cells[4].Value))
                {
                    List<string> alt = new List<string>();
                    alt.Add("PlanoGerado = 1");
                    sql = SqlCrud.getInstance.updateById(ConstTabelas.REQUISIÇÃO, alt, ConstTabelas.REQUISIÇÃO_PK, r.Cells[0].Value.ToString());
                    if (!Conexao.getInstance.execute(sql, false))
                    {
                        return false;
                    }
                }
            }
            
            Conexao.getInstance.CommitTransacao();
            return true;
        }

    }
}
